// OutputBar.cpp : implementation file
//
/////////////////////////////////////////////////////////////////////////////

#include "StdAfx.h"
#include "Resource.h"
#include "OutputBar.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// COutputBar

COutputBar::COutputBar()
{
	NONCLIENTMETRICS ncm;
	memset(&ncm, 0, sizeof(NONCLIENTMETRICS));
	ncm.cbSize = sizeof(NONCLIENTMETRICS);
	VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
		sizeof(NONCLIENTMETRICS), &ncm, 0));
	_tcscpy( ncm.lfMessageFont.lfFaceName, _T("Courier"));
	m_Font.CreateFontIndirect(&ncm.lfMessageFont);
}

COutputBar::~COutputBar()
{
	// TODO: add destruction code here.
}

IMPLEMENT_DYNAMIC(COutputBar, CCJControlBar)

BEGIN_MESSAGE_MAP(COutputBar, CCJControlBar)
	//{{AFX_MSG_MAP(COutputBar)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static CString strBuild[] =
{
	_T("--------------------Configuration: TestApp - Win32 Debug--------------------"),
	_T("Compiling..."),
	_T("TestAppView.cpp"),
	_T("Linking..."),
	_T(""),
	_T("TestApp.exe - 0 error(s), 0 warning(s)"),
};

static CString strDebug[] =
{
	_T("Loaded 'E:\\WINNT\\System32\\ntdll.dll', no matching symbolic information found."),
	_T("Loaded symbols for 'E:\\WINNT\\system32\\MFC42D.DLL'"),
	_T("Loaded symbols for 'E:\\WINNT\\system32\\MSVCRTD.DLL'"),
	_T("Loaded 'E:\\WINNT\\system32\\KERNEL32.DLL', no matching symbolic information found."),
	_T("Loaded 'E:\\WINNT\\system32\\GDI32.DLL', no matching symbolic information found."),
	_T("Loaded 'E:\\WINNT\\system32\\USER32.DLL', no matching symbolic information found."),
	_T("Loaded 'E:\\WINNT\\system32\\ADVAPI32.DLL', no matching symbolic information found."),
	_T("Loaded 'E:\\WINNT\\system32\\RPCRT4.DLL', no matching symbolic information found."),
	_T("Loaded symbols for 'E:\\WINNT\\system32\\MFCO42D.DLL'")
};

static CString strTabs[] =
{
	"Build",
	"Debug",
	"Find in Files 1",
	"Find in Files 2"
};

/////////////////////////////////////////////////////////////////////////////
// COutputBar message handlers

int COutputBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CCJControlBar::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_FlatTabCtrl.Create(NULL, "", WS_VISIBLE | WS_CHILD | FTS_HASARROWS | FTS_BOTTOM,
		CRect(10,10,200,25), this, IDC_FLATTAB))
	{
		TRACE0(_T("Unable to create flat tab control bar\n"));
		return -1;
	}
	
	int nItemCount = sizeof(strTabs)/sizeof(strTabs[0]);
	for( int iItem = 0; iItem < nItemCount; ++iItem)
	{
		m_FlatTabCtrl.InsertItem(iItem, strTabs[iItem]);
	}

	DWORD dwStyle = WS_CHILD | WS_VISIBLE | LBS_NOINTEGRALHEIGHT | 
		WS_VSCROLL | WS_TABSTOP;

	int nListCount = sizeof(m_OutputList)/sizeof(m_OutputList[0]);
	for( int iList = 0; iList < nListCount; ++iList)
	{
		if (!m_OutputList[iList].Create( dwStyle, CRect(0,0,0,0), this,
			IDC_OUTPUT_LIST+iList ))
		{
			TRACE(_T("Failed to create output window.\n"));
			return -1;
		}
		m_OutputList[iList].SetFont( &m_Font );
	}
	
	int nBuildCount = sizeof(strBuild)/sizeof(strBuild[0]);
	for( int i = 0; i < nBuildCount; ++i)
	{
		m_OutputList[0].AddString(strBuild[i]);
	}

	int nDebugCount = sizeof(strDebug)/sizeof(strDebug[0]);
	for(int i = 0; i < nDebugCount; ++i)
	{
		m_OutputList[1].AddString(strDebug[i]);
	}

	SelectTabView(0);
	return 0;
}

BOOL COutputBar::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
	if(IDC_FLATTAB == (UINT)wParam)
	{
		NMHDR* pNMHDR = (NMHDR*)lParam;

		switch(pNMHDR->code)
		{
		case TCN_SELCHANGING:
			break;
		case TCN_SELCHANGE:
			SelectTabView(m_FlatTabCtrl.GetCurSel());
			break;
		}
	}
	
	return CCJControlBar::OnNotify(wParam, lParam, pResult);
}

void COutputBar::SelectTabView(int nTab)
{
	int nListCount = sizeof(m_OutputList)/sizeof(m_OutputList[0]);
	for( int iList = 0; iList < nListCount; ++iList) {
		m_OutputList[iList].ShowWindow(SW_HIDE);
	}

	m_OutputList[nTab].ShowWindow(SW_SHOW);
}

void COutputBar::OnSize(UINT nType, int cx, int cy) 
{
	CCJControlBar::OnSize(nType, cx, cy);
	
	if(m_FlatTabCtrl.GetSafeHwnd())
	{
		CRect rc;
		GetChildRect(rc);
		rc.DeflateRect(1,1);

		int nListCount = sizeof(m_OutputList)/sizeof(m_OutputList[0]);
		for( int iList = 0; iList < nListCount; ++iList) {
			m_OutputList[iList].MoveWindow(rc.left, rc.top,
				rc.Width(), rc.bottom-(IsFloating()?18:19));
		}

		m_FlatTabCtrl.MoveWindow(rc.left, rc.bottom-15, rc.Width(), 15);
	}
}

void COutputBar::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CRect rc;
	//m_iAuxImage = (UINT)-1;
	GetClientRect(&rc);
	CRect rect;
	GetChildRect(rect);
	DrawBorders(&dc,rc);
	dc.Draw3dRect(rect, ::GetSysColor(COLOR_3DDKSHADOW),
		::GetSysColor(COLOR_3DDKSHADOW));
}
